package edu.algo3.algoThief.domain;

import edu.algo3.algoThief.dao.Repositorio;
import edu.algo3.algoThief.util.Constants;

public class ContextoDelJuego {

    private CargoPoliciaco cargoPoliciaco;

    private Caso caso;

    private Edificio edificioActual;
    
    private CondicionDeTriunfo condicionDeTriunfo;
    
    public ContextoDelJuego(Integer arrestos){
        definirContexto(arrestos);
    }
    
    public ContextoDelJuego(String jugadorNombre){
        definirContexto(jugadorNombre);
    }
    
    private void definirContexto(Integer arrestos) {
        if (Constants.ARRESTOS_DETECTIVE > arrestos.intValue()){
            this.cargoPoliciaco = new Novato();
        } else if (Constants.ARRESTOS_INVESTIGADOR > arrestos.intValue()) {
            this.cargoPoliciaco = new Detective();
        } else if (Constants.ARRESTOS_SARGENTO > arrestos.intValue()) {
            this.cargoPoliciaco = new Investigador();
        } else {
            this.cargoPoliciaco = new Sargento();
        }
        // SE PROCEDE A PREPARAR EL CASO CORRESPONDIENTE AL CARGO POLICIACO DEFINIDO
        this.caso = this.cargoPoliciaco.prepararCaso();
        this.condicionDeTriunfo = new CondicionDeTriunfo(this.caso.getUltimaCiudadDeEscape());
        // POR EL MOMENTO NO HA ENTRADO A NINGUN EDIFICIO
        this.edificioActual = null;
    }
    
    private void definirContexto(String jugadorNombre)
    {
        if (Constants.ARRESTOS_DETECTIVE > Repositorio.cargarJugadorArrestos(jugadorNombre)){
            this.cargoPoliciaco = new Novato();
        } else if (Constants.ARRESTOS_INVESTIGADOR > Repositorio.cargarJugadorArrestos(jugadorNombre)) {
            this.cargoPoliciaco = new Detective();
        } else if (Constants.ARRESTOS_SARGENTO > Repositorio.cargarJugadorArrestos(jugadorNombre)) {
            this.cargoPoliciaco = new Investigador();
        } else {
            this.cargoPoliciaco = new Sargento();
        }
        // SE PROCEDE A PREPARAR EL CASO CORRESPONDIENTE AL CARGO POLICIACO DEFINIDO
        this.caso = this.cargoPoliciaco.prepararCaso(jugadorNombre);
        
        if (Repositorio.cargarJugadorEdificioActual(jugadorNombre).equals(Constants.DESCRIPCION_EIDIFICIO_AEROPUERTO)){
            this.edificioActual = new Aeropuerto();
        } else if (Repositorio.cargarJugadorEdificioActual(jugadorNombre).equals(Constants.DESCRIPCION_EIDIFICIO_BANCO)) {
        	this.edificioActual = new Banco();
        } else if (Repositorio.cargarJugadorEdificioActual(jugadorNombre).equals(Constants.DESCRIPCION_EIDIFICIO_BIBLIOTECA)) {
        	this.edificioActual = new Biblioteca();
        }
        this.condicionDeTriunfo = new CondicionDeTriunfo(this.caso.getUltimaCiudadDeEscape());
    }
    
    public Pista getPista(){
        return null;
    }

    public CargoPoliciaco getCargoPoliciaco() {

        return cargoPoliciaco;
    }

    public void setCargoPoliciaco(CargoPoliciaco cargoPoliciaco) {

        this.cargoPoliciaco = cargoPoliciaco;
    }

    public Caso getCaso() {

        return caso;
    }

    public void setCaso(Caso caso) {

        this.caso = caso;
    }

    public Edificio getEdificioActual() {

        return edificioActual;
    }

    public void setEdificioActual(Edificio edificioActual) {

        this.edificioActual = edificioActual;
    }

    
    public CondicionDeTriunfo getCondicionDeTriunfo() {
    
        return condicionDeTriunfo;
    }

}
